package com.sunzm.common.utils.freemarker;

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 使用freemarker动态生成SQL语句的示例代码
 *
 * @author Administrator
 * @version 1.0
 * @date 2021-07-20 13:16
 */
public class FreemarkerSQLGenDemo {

    public static void main(String[] args) throws Exception {
        // 第一步：创建一个Configuration对象，直接new一个对象。构造方法的参数就是freemarker对应版本号。
        Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
        // 第二步：设置模板文件所在的路径。
        String path = Thread.currentThread().getContextClassLoader().getResource("./").getPath();
        cfg.setDirectoryForTemplateLoading(new File(path));
        // 第三步：设置模板文件使用的字符集。一般就是UTF-8.
        cfg.setDefaultEncoding("UTF-8");
        //configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
        // 第四步：加载一个模板，创建一个模板对象。
        Template template = cfg.getTemplate("sql.ftl");
        //template.set
        // 第五步：创建一个模板使用的数据集，可以是pojo也可以是map。一般是Map。
        Map<String, Object> dataModel = new HashMap<>(3);

        //主键
        List<DBModel> pkList = new ArrayList<>();
        DBModel pk1 = new DBModel("resultDate", "2021-07-20");
        DBModel pk2 = new DBModel("companyId", "cmp001");

        pkList.add(pk1);
        pkList.add(pk2);

        //普通字段
        List<DBModel> dataList = new ArrayList<>();
        DBModel data1 = new DBModel("callCount", DBOpeType.Accumulate, "30");
        DBModel data2 = new DBModel("callSuccCount", DBOpeType.Accumulate, "22");
        DBModel data3 = new DBModel("maxAge", DBOpeType.Max, "20");
        DBModel data4 = new DBModel("minAge", DBOpeType.Min, "12");
        DBModel data5 = new DBModel("name", DBOpeType.Replace, "zhangsan");

        dataList.add(data1);
        dataList.add(data2);
        dataList.add(data3);
        dataList.add(data4);
        dataList.add(data5);

        //表名
        dataModel.put("tableName", "user_table1");
        //主键
        dataModel.put("pkList", pkList);
        //普通字段
        dataModel.put("dataList", dataList);
        // 第六步：创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        //Writer out = new FileWriter(new File(path + "/table_select.sql"));
        Writer out = new OutputStreamWriter(System.out);
        // 第七步：调用模板对象的process方法输出文件。
        template.process(dataModel, out);

        // 第八步：关闭流。
        out.close();
    }

}
